package cn.hgy.domain.activity.service.trial.node;

import cn.hgy.domain.activity.model.entity.MarketProductEntity;
import cn.hgy.domain.activity.model.entity.TrialBalanceEntity;
import cn.hgy.domain.activity.service.trial.AbstractGroupBuyMarketSupport;
import cn.hgy.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import cn.hgy.types.enums.ResponseCode;
import cn.hgy.types.exception.AppException;
import cn.hgy.types.tree.StrategyHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 拼团商品策略路由节点（中间路由层）
 * 承接RootNode的请求，实现策略路由的二次转发
 *
 * 设计说明：
 * 1. 作为策略模式中的中间路由节点，不包含业务逻辑
 * 2. 主要负责请求的透传与策略路由的二次分发
 * 3. 设计为无状态服务，线程安全
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class SwitchRoot extends AbstractGroupBuyMarketSupport<MarketProductEntity, DefaultActivityStrategyFactory.DynamicContext, TrialBalanceEntity> {

    // 下游策略节点，实际业务处理节点
    private final MarketNode marketNode;

    /**
     * 请求透传方法
     * @param requestParameter 商品请求实体
     * @param dynamicContext 策略运行时上下文
     * @return 透传路由结果
     * @throws Exception 路由异常时抛出
     */
    @Override
    public TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {

        String userId = requestParameter.getUserId();
        if (activityRepository.downgradeSwitch()) {
            throw new AppException(ResponseCode.E0003.getCode(), ResponseCode.E0003.getInfo());
        }

        if (!activityRepository.cutRange(userId)) {
            throw new AppException(ResponseCode.E0004.getCode(), ResponseCode.E0004.getInfo());
        }
        return router(requestParameter, dynamicContext);
    }

    /**
     * 获取下一级策略处理器
     * @param requestParameter 商品请求参数（用于动态路由）
     * @param dynamicContext 策略动态上下文
     * @return 固定返回marketNode策略处理器
     */
    @Override
    public StrategyHandler<MarketProductEntity, DefaultActivityStrategyFactory.DynamicContext, TrialBalanceEntity> get(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) {
        // 1. 此处固定返回marketNode，实现策略链的静态路由
        // 2. 如需动态路由，可基于requestParameter/dynamicContext实现条件选择
        return marketNode;
    }
}